C++另辟蹊径计算1到n的和 您所在的位置:网站首页 CHUKA Student Portal C++另辟蹊径计算1到n的和

C++另辟蹊径计算1到n的和

#C++另辟蹊径计算1到n的和| 来源: 网络整理| 查看: 265

C++另辟蹊径计算1到n的和

注:满足题目要求的解法有递归实现的第三种、公式实现、C++调用构造函数累加法三种方法、

 

一、题目简单描述

最近看到一道很有趣的算法题,更像脑筋急转弯吧,如下图:

我们可以看到,题目中给出的限制条件很多。先不管限制条件是什么,我们计算1到n的和无非就是用循环、递归、公式(等差数列)三类方法来计算。当然,循环实现很简单,这里就不再介绍。那么,不用循环怎么实现呢?我们先看用递归的方法。

 

二、递归实现

注意,我们先不管题目给出的限制条件,我们这里只限制不能用循环只用递归,看看都有哪些方法。

1、if…else…

用if…else…来判断递归的停止条件,相对也很容易,我们直接看代码。

int Sum_Solution(int n) { if (n == 1) return 1; return n + Sum_Solution(n - 1); } int main() { int n = 0; scanf("%d", &n); int ret=Sum_Solution(n); printf("%d", ret); return 0; }

2、三目运算符 ?:

在不用循环和if…else…的情况下还能怎么用呢?我们还可以想到三目运算符。其实三目运算符与if…else…思想大同小异,我们直接看代码。

int sum_solution(int n) { return n==1?1:sum_solution(n-1)+n; } int main() { int n = 0; scanf("%d", &n); int ret=Sum_Solution(n); printf("%d", ret); return 0; }

3、逻辑与操作符 &&

难度加大,在不用循环和if…else…和三目运算符的情况下还能怎么用呢?好像不容易想出来其他方法了。其实当我们熟知逻辑与操作符(&&)的一个特性时,也就很用以做出来。当提到逻辑与操作符时,可能一时间想不到该怎么用。这时我们想想逻辑与操作符的性质。当两个条件同时为真时才为真,当第一个条件为假时,就不执行第二个条件了。这就是我们要抓住的点,来作为递归停止的条件。我们直接看代码。

int Sum_Solution(int n ) { int sum=n; sum&&(sum+=Sum_Solution(n-1)); return sum; } int main() { int n = 0; scanf("%d", &n); int ret=Sum_Solution(n); printf("%d", ret); return 0; }

其实这种解法就满足本题目的要求了。

 

三、公式实现

公式实现的方法有很多,用乘除法、循环都很容易实现。但是题目中还要求了不能够用乘除法,那怎么用公式实现呢?在这里用了一个很巧妙的方法,就是定义一个二维数组,数组存储的数据类型大小为一个字节,通过计算数组的大小,最后用右移操作符(>>)相当于除于2来实现。我们结合代码一起理解一下。

int Sum_Solution(int n ) { char arr[n][n+1]; return sizeof(arr)>>1; } int main() { int n = 0; scanf("%d", &n); int ret=Sum_Solution(n); printf("%d", ret); return 0; }

这种解法也满足题目的要求。

 

四、C++调用构造函数累加法

我们都知道C++在类和对象中,实例化对象都会调用构造函数。我们通过创建n个对象,同时设置成员变量为静态的,调用构造函数的累加法来实现。文字可能会有点不易理解,我们直接看代码。

class sum { public: sum() { ret+=i; ++i; } static int GetRet() { return ret; } private: static int ret; static int i; }; int sum::ret=0; int sum::i=1; class Solution { public: int Sum_Solution(int n) { sum a[n]; return sum::GetRet(); } };

这种方法也是满足题目的要求的。

我个人感觉这道题目挺有趣的,就整理出来跟大家分享一下。当然,可能还有其它的解法,欢迎大家讨论。

希望本篇文章对你有所帮助,感谢观看ovo!

关于C++另辟蹊径计算1到n的和的文章就介绍至此,更多相关C++计算1到n的和内容请搜索编程宝库以前的文章,希望以后支持编程宝库!

下一节:详解C++中的万能头文件C语言编程技术

 一、什么是万能头文件?C++的万能头文件是:#include 它是一个包含了每一个标准库的头文件。优点:在算法竞赛中节约时间;减少了编写所有必要头文件的工作量。 ...



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有